﻿//using Infrastructure.Enums;
//using System;
//using System.Collections.Generic;
//using System.ComponentModel.DataAnnotations;
//using System.ComponentModel.DataAnnotations.Schema;
//using System.Data;
//using System.Linq;
//using System.Linq.Expressions;
//using System.Reflection;
//using System.Text;


//namespace Infrastructure.Extensions
//{
//    /// <summary>
//    /// 通用实体属操作
//    /// </summary>
//    public static class EntityProperties
//    {
//        public static string GetExpressionPropertyFirst<TEntity>(this Expression<Func<TEntity, object>> properties)
//        {
//            string[] arr = properties.GetExpressionProperty();
//            if (arr.Length > 0)
//                return arr[0];
//            return "";
//        }

//        /// <summary>
//        /// 获取对象里指定成员名称
//        /// </summary>
//        /// <typeparam name="TEntity"></typeparam>
//        /// <param name="properties"> 格式 Expression<Func<entityt, object>> exp = x => new { x.字段1, x.字段2 };或x=>x.Name</param>
//        /// <returns></returns>
//        public static string[] GetExpressionProperty<TEntity>(this Expression<Func<TEntity, object>> properties)
//        {
//            if (properties == null)
//                return new string[] { };
//            if (properties.Body is NewExpression)
//                return ((NewExpression)properties.Body).Members.Select(x => x.Name).ToArray();
//            if (properties.Body is MemberExpression)
//                return new string[] { ((MemberExpression)properties.Body).Member.Name };
//            if (properties.Body is UnaryExpression)
//                return new string[] { ((properties.Body as UnaryExpression).Operand as MemberExpression).Member.Name };
//            throw new Exception("未实现的表达式");
//        }

//        /// <summary>
//        /// 属性判断
//        /// </summary>
//        /// <param name="type"></param>
//        /// <returns></returns>
//        public static IEnumerable<PropertyInfo> GetGenericProperties(this Type type)
//        {
//            return type.GetProperties().GetGenericProperties();
//        }
//        /// <summary>
//        /// 属性判断待完
//        /// </summary>
//        /// <param name="properties"></param>
//        /// <returns></returns>
//        public static IEnumerable<PropertyInfo> GetGenericProperties(this IEnumerable<PropertyInfo> properties)
//        {
//            return properties.Where(x => !x.PropertyType.IsGenericType && x.PropertyType.GetInterface("IList") == null || x.PropertyType.GetInterface("IEnumerable", false) == null);
//        }

//        /// <summary>
//        /// 获取对象表达式指定属性的值
//        /// 如获取:Out_Scheduling对象的ID或基他字段
//        /// </summary>
//        /// <typeparam name="TEntity"></typeparam>
//        /// <param name="expression">格式 Expression<Func<Out_Scheduling, object>>sch=x=>new {x.v1,x.v2} or x=>x.v1 解析里面的值返回为数组</param>
//        /// <returns></returns>
//        public static string[] GetExpressionToArray<TEntity>(this Expression<Func<TEntity, object>> expression)
//        {
//            string[] propertyNames = null;
//            if (expression.Body is MemberExpression)
//            {
//                propertyNames = new string[] { ((MemberExpression)expression.Body).Member.Name };
//            }
//            else
//            {
//                propertyNames = expression.GetExpressionProperty().Distinct().ToArray();
//            }
//            return propertyNames;
//        }

//        /// <summary>
//        /// 获取所有字段的名称 
//        /// </summary>
//        /// <param name="typeinfo"></param>
//        /// <returns></returns>
//        public static List<string> GetAtrrNames(this Type typeinfo)
//        {
//            return typeinfo.GetProperties().Select(c => c.Name).ToList();
//        }

//        /// <summary>
//        /// 获取主键名称
//        /// </summary>
//        /// <param name="typeinfo"></param>
//        /// <returns></returns>
//        public static string GetKeyName(this Type typeinfo)
//        {
//            return typeinfo.GetProperties().GetKeyProperty().Name;
//        }
//        /// <summary>
//        /// 获取主键字段
//        /// </summary>
//        /// <param name="propertyInfo"></param>
//        /// <returns></returns>
//        public static PropertyInfo GetKeyProperty(this Type entity)
//        {
//            return entity.GetProperties().GetKeyProperty();
//        }
//        public static PropertyInfo GetKeyProperty(this PropertyInfo[] properties)
//        {
//            return properties.Where(c => c.IsKey()).FirstOrDefault();
//        }
//        /// <summary>
//        /// 是否是主键
//        /// </summary>
//        /// <param name="propertyInfo"></param>
//        /// <returns></returns>
//        public static bool IsKey(this PropertyInfo propertyInfo)
//        {
//            object[] keyAttributes = propertyInfo.GetCustomAttributes(typeof(KeyAttribute), false);
//            if (keyAttributes.Length > 0)
//                return true;
//            return false;
//        }


//        /// <summary>
//        /// 判断是否包含某个属性：
//        /// 如 [Editable(true)]
//        //  public string MO { get; set; }包含Editable
//        /// </summary>
//        /// <param name="propertyInfo"></param>
//        /// <param name="type"></param>
//        /// <returns></returns>
//        public static bool ContainsCustomAttributes(this PropertyInfo propertyInfo, Type type)
//        {
//            propertyInfo.GetTypeCustomAttributes(type, out bool contains);
//            return contains;
//        }

//        /// <summary>
//        /// 根据实体获取key的类型，用于update或del操作
//        /// </summary>
//        /// <typeparam name="T"></typeparam>
//        /// <returns></returns>
//        public static FieldType GetFieldType(this Type typeEntity)
//        {
//            FieldType fieldType;
//            string columnType = typeEntity.GetProperties().Where(x => x.Name == typeEntity.GetKeyName()).ToList()[0].GetColumnType(false).Value;
//            switch (columnType)
//            {
//                case SqlDbTypeName.Int: fieldType = FieldType.Int; break;
//                case SqlDbTypeName.BigInt: fieldType = FieldType.BigInt; break;
//                case SqlDbTypeName.VarChar: fieldType = FieldType.VarChar; break;
//                case SqlDbTypeName.UniqueIdentifier: fieldType = FieldType.UniqueIdentifier; break;
//                default: fieldType = FieldType.NvarChar; break;
//            }
//            return fieldType;
//        }


//        /// <summary>
//        /// 返回属性的字段及数据库类型
//        /// </summary>
//        /// <param name="property"></param>
//        /// <param name="lenght">是否包括后字段具体长度:nvarchar(100)</param>
//        /// <returns></returns>
//        public static KeyValuePair<string, string> GetColumnType(this PropertyInfo property, bool lenght = false)
//        {
//            string colType = "";
//            object objAtrr = property.GetTypeCustomAttributes(typeof(ColumnAttribute), out bool asType);
//            if (asType)
//            {
//                colType = ((ColumnAttribute)objAtrr).TypeName.ToLower();
//                if (!string.IsNullOrEmpty(colType))
//                {
//                    //不需要具体长度直接返回
//                    if (!lenght)
//                    {
//                        return new KeyValuePair<string, string>(property.Name, colType);
//                    }
//                    if (colType == "decimal" || colType == "double" || colType == "float")
//                    {
//                        objAtrr = property.GetTypeCustomAttributes(typeof(DisplayFormatAttribute), out asType);
//                        colType += "(" + (asType ? ((DisplayFormatAttribute)objAtrr).DataFormatString : "18,5") + ")";

//                    }
//                    ///如果是string,根据 varchar或nvarchar判断最大长度
//                    if (property.PropertyType.ToString() == "System.String")
//                    {
//                        colType = colType.Split('(')[0];
//                        objAtrr = property.GetTypeCustomAttributes(typeof(MaxLengthAttribute), out asType);
//                        if (asType)
//                        {
//                            int length = ((MaxLengthAttribute)objAtrr).Length;
//                            colType += "(" + (length < 1 || length > (colType.StartsWith("n") ? 8000 : 4000) ? "max" : length.ToString()) + ")";
//                        }
//                        else
//                        {
//                            colType += "(max)";
//                        }
//                    }
//                    return new KeyValuePair<string, string>(property.Name, colType);
//                }
//            }
//            if (entityMapDbColumnType.TryGetValue(property.PropertyType, out string value))
//            {
//                colType = value;
//            }
//            else
//            {
//                colType = SqlDbTypeName.NVarChar;
//            }
//            if (lenght && colType == SqlDbTypeName.NVarChar)
//            {
//                colType = "nvarchar(max)";
//            }
//            return new KeyValuePair<string, string>(property.Name, colType);
//        }

//        private static readonly Dictionary<Type, string> entityMapDbColumnType = new Dictionary<Type, string>() {
//                    {typeof(int),SqlDbTypeName.Int },
//                    {typeof(int?),SqlDbTypeName.Int },
//                    {typeof(long),SqlDbTypeName.BigInt },
//                    {typeof(long?),SqlDbTypeName.BigInt },
//                    {typeof(decimal),"decimal(18, 5)" },
//                    {typeof(decimal?),"decimal(18, 5)"  },
//                    {typeof(double),"decimal(18, 5)" },
//                    {typeof(double?),"decimal(18, 5)" },
//                    {typeof(float),"decimal(18, 5)" },
//                    {typeof(float?),"decimal(18, 5)" },
//                    {typeof(Guid),"UniqueIdentifier" },
//                    {typeof(Guid?),"UniqueIdentifier" },
//                    {typeof(byte),"tinyint" },
//                    {typeof(byte?),"tinyint" },
//                    {typeof(string),"nvarchar" }
//        };

//        /// <summary>
//        /// 获取PropertyInfo指定属性
//        /// </summary>
//        /// <param name="propertyInfo"></param>
//        /// <param name="type"></param>
//        /// <returns></returns>
//        public static object GetTypeCustomAttributes(this PropertyInfo propertyInfo, Type type, out bool asType)
//        {
//            object[] attributes = propertyInfo.GetCustomAttributes(type, false);
//            if (attributes.Length == 0)
//            {
//                asType = false;
//                return new string[0];
//            }
//            asType = true;
//            return attributes[0];
//        }

//    }
//    public class ArrayEntity
//    {
//        public string column1 { get; set; }
//    }

//    public enum FieldType
//    {
//        VarChar = 0,
//        NvarChar,
//        Int,
//        BigInt,
//        UniqueIdentifier
//    }

//    public enum EntityToSqlTempName
//    {
//        TempInsert = 0
//    }
//}
